package subraSoft.centaurus.model.report;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Map;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.apache.log4j.Logger;

import subraSoft.centaurus.model.util.CenConfigurationUtil;

public final class CenReport 
{
	private static final Logger logger = Logger.getLogger(CenReport.class);
	
	/**
	 * Genera el reporte y retorna la direccion del reporte generado.
	 * 
	 * @param fileName nombre del archivo de jasper sin extension
	 * @param parameters parametros para generar el reporte
	 * @return la direccion del pdf generado
	 * @throws CenReportException ante errores en la generacion del reporte.
	 */
	public static File generarReporte(String fileName, Map<String, Object> parameters) throws CenReportException
	{
		File file = null;
		try 
		{
			JasperPrint p = JasperFillManager.fillReport("jasper"+File.separator+fileName+".jasper", parameters, getConnection());
			long milis = System.currentTimeMillis();
			String pdfTemp = CenConfigurationUtil.getInstance().getTempFolder()+File.separator+fileName+"-"+milis+".pdf";
			logger.debug("Guardando reporte temporal en : " + pdfTemp);
			JasperExportManager.exportReportToPdfFile(p, pdfTemp);
			file = new File(pdfTemp);
		} 
		catch (Exception e) 
		{
			logger.error(e, e);
			throw new CenReportException("No se pudo generar el reporte ", e);
		}
		return file;
	}
	
	/**
	 * Obtiene la coneccion con la base de datos para que el reporte
	 * pueda tomar datos de la base.
	 * 
	 * @return la coneccion establecida
	 * @throws ClassNotFoundException si no encuentra la case del driver de la base de datos.
	 * @throws SQLException en caso de errores en el authenticacion con la base
	 */
	private static Connection getConnection() throws ClassNotFoundException, SQLException
	{
		CenConfigurationUtil c = CenConfigurationUtil.getInstance();
		String driver = c.getProperty(CenConfigurationUtil.BASE_DRIVER);  
		String connectString = c.getProperty(CenConfigurationUtil.BASE_URL);  
		String user = c.getProperty(CenConfigurationUtil.BASE_USER);  
		String password = c.getProperty(CenConfigurationUtil.BASE_PASS);  

		Class.forName(driver);
		Connection conn = DriverManager.getConnection(connectString, user, password);
		return conn;
	}
}
